package Solution.problem093.RestoreIPAddresses;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @program Leetcode
 * @description:
 * @author: lishangsheng
 * @create: 2019/07/04 18:34
 */
public class Solution {
    List<String> res = new ArrayList<>();

    public List<String> restoreIpAddresses(String s) {

        if (s.length() > 12 || s.length() < 4) {
            return res;

        }
        ipHelper(s, 0, new ArrayList<>());
        return res;
    }

    /**
     * @param s     街衢对应段之后段字符串
     * @param count 正在计算的段，0，1，2，3
     * @param list  中间结果
     */
    private void ipHelper(String s, int count, List<String> list) {
        /*不是最后一段的时候*/
        if (count != 3) {
            /*最小的是后面每段都是3，他这边最少得取的值，下限是1*/
            int low = s.length() - (3 - count) * 3 > 1 ? s.length() - (3 - count) * 3 : 1;
            /*最大的是后面每段都是1，他这边最多得取的值，上线是3*/
            int up = s.length() - (3 - count) < 3 ? s.length() - (3 - count) : 3;
            if (low > up) {
                return;
            }
            for (int i = low; i <= up; i++) {
                String s1 = s.substring(0, i);
                Integer value1 = Integer.parseInt(s1);
                /*抛弃连续0的情况*/
                if (i > 1 && s1.startsWith("0")) {
                    return;
                }
                /*兼容0.0.0.0的情况*/
                if (value1 < 0 || value1 > 255) {
                    /*不符合生成条件*/
                    return;
                }
                list.add(s1);
                ipHelper(s.substring(i), count + 1, list);
                list.remove(count);
            }
        } else {
            if (s.length() > 3) {
                /*不符合规则*/
                return;
            }
            Integer value1 = Integer.parseInt(s);
            if (s.length() > 1 && s.startsWith("0")) {
                return;
            }
            /*兼容0.0.0.0的情况*/
            if (value1 < 0 || value1 > 255) {
                /*不符合生成条件*/
                return;
            }
            list.add(s);
            res.add(String.join(".", list));
            list.remove(count);
        }
    }


    @Test
    public void test() {
        String s = "0000";
        String s1 = "010010";
        List<String> result = restoreIpAddresses(s1);
        System.out.println(result);
    }
}
